package framework;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;

import framework.BaseFormExtended.Portal;
import framework.advs.BaseAdvertisment;
import webdriver.BaseEntity;


/** Базовый класс для работы с таблицами Excel
 */
public class ExcelManager extends BaseEntity{

	private static final String SHEET_NAME = "Exported data";
	private final static String BOOK_NAME = "Exported Advs.xls";
	public static HSSFWorkbook workbook;

	/** Создает объект книги эксель
	 * @return - очищенное название плана
	 */
	public HSSFWorkbook getBookInstance(){
		if (workbook==null){
			workbook = new HSSFWorkbook();
			createSheets();
		}
		return workbook;
	}
	/** Создает листы в книге для каждого портала
	 */
	public void createSheets(){
		for(Portal p:Portal.values()){
			workbook.createSheet(p.toString());
		}
		logger.info("Успешно созданы "+workbook.getNumberOfSheets() + " листов в книге");
	}

	/** Сохраняет файл экселя
	 * @param book - книга эксель
	 * @param bookName - название, под которым сохранится файл эксель
	 */
	private void writeExcelBook(HSSFWorkbook book, String bookName){
		try {
			FileOutputStream out = new FileOutputStream(bookName);
			book.write(out);
			out.close();
			logger.info("Данные успешно сохранены в книге Excel!");
			} catch (FileNotFoundException e) {
			e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}

	/** Выгружает массив в файл экселя
	 * @param list - массив
	 * @param p - название портала для сохранения на соотв. лист
	 */
	public void exportDataToExcel(ArrayList<BaseAdvertisment> list, Portal p){
		HSSFWorkbook book = getBookInstance();
		int totalRows = list.size();
		int totalCols = list.get(0).size();
		shiftRows(book, totalRows, p);
		for (int i=0; i<totalRows; i++){ // перебираем значения массива и записываем в эксель
			BaseAdvertisment b = list.get(i);
			if (i==0){
				Row row = book.getSheet(p.toString()).createRow(i);
				Row row2 = book.getSheet(p.toString()).createRow(i+1);
				for (int j = 1; j<=totalCols; j++){
					Cell cell = row.createCell(j);
					cell.setCellValue(b.getFieldNames(j));
						cell = row2.createCell(j);
						cell.setCellValue(b.getValue(j));
					}
			}else {
				Row row = book.getSheet(p.toString()).createRow(i+1);
			for (int j = 1; j<=totalCols; j++){
					Cell cell = row.createCell(j);
					cell.setCellValue(b.getValue(j));
			}
		}
		writeExcelBook(book, BOOK_NAME); //сохраняем книгу в файл
	}
	}
	/** Сдвигает данные в экселе на нужное число строк для записи
	 * @param book - книга эксель
	 * @param newAdsCount - размер сдвига в строках
	 */
	private void shiftRows(HSSFWorkbook book, int newAdsCount, Portal p) {
	HSSFSheet sheet = 	book.getSheet(p.toString());
	info("book.sheets" + book.getSheetName(0));
	info("book.sheets" + book.getSheetName(1));
	int rowCount = sheet.getLastRowNum();
	if (rowCount>0){
		sheet.shiftRows(1, rowCount, newAdsCount);
	}
	}

	@Override
	protected String formatLogMsg(String message) {
		return null;
	}

}
